package com.zy.core.data.jpa.support.manager;


import com.zy.core.data.jpa.support.entity.page.Pagination;

import java.io.Serializable;
import java.util.List;

/**
 * manager 接口,所有接口都应在此接口上做扩展
 * @param <T>
 * @param <ID>
 */
public interface BaseManager<T, ID extends Serializable> {

	/**
	 * 根据id查出唯一的实体
	 * @param id
	 * @return
	 */
	T findById(ID id);

	/**
	 * 查找全部的实体
	 * @return
	 */
	List<T> findAll();

	/**
	 * 根据id数组查找出对应的实体
	 * @param ids
	 * @return
	 */
	List<T> findList(ID[] ids);

	/**
	 * 根据id集合查找出对应的实体集合
	 * @param ids
	 * @return
	 */
	List<T> findList(Iterable<ID> ids);

	/**
	 * 根据分页参数查询出分页对象
	 * @param pageNo 页码
	 * @param pageSize 每页数据量
	 * @return
	 */
	Pagination<T> findAll(int pageNo, int pageSize);

	/**
	 * 查询出总数
	 * @return
	 */
	long count();

	/**
	 * 书否存在该实体
	 * @param id
	 * @return
	 */
	boolean exists(ID id);

	/**
	 * 保存并且返回已保存的实体
	 * @param entity
	 * @return
	 */
	T save(T entity);

	/**
	 * 更新 并返回已更新的实体
	 * @param entity
	 * @return
	 */
	T update(T entity);

	/**
	 * 可自定义更新参数
	 * @param entity 待更新实体
	 * @param includePropertys 必须更新的字段 可为null
	 * @param excludePropertys 排除需要更新的字段 可为null
	 * @return
	 */
	T update(T entity, String[] includePropertys, String[] excludePropertys);

	/**
	 * 删除
	 * @param id 需要删除的实体主键id
	 */
	void deleteById(ID id);

	/**
	 * 根据主键id批量删除
	 * @param ids 主键数组
	 */
	void deleteByIds(@SuppressWarnings("unchecked") ID... ids);

	/**
	 * 根据实体数组删除(必须要有主键)
	 * @param entitys
	 */
	void delete(T[] entitys);

	/**
	 * 根据实体集合批量删除(必须要有主键)
	 * @param entitys
	 */
	void delete(Iterable<T> entitys);

	/**
	 * 删除某个实体
	 * @param entity
	 */
	void delete(T entity);

	/**
	 * 批量保存
	 * @param iterable
	 * @return
	 */
	List<T> save(Iterable<T> iterable);

}